home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / etoc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-08  |  1.5 KB  |  66 lines

  1. /*
  2.                             E T O C . C
  3.  
  4.                    Convert expression to pure code
  5. */
  6.  
  7. #include "iccomp.h"
  8.  
  9. void etoc(e)
  10.     ESTRUC_
  11.         *e;
  12. {
  13.     ESTRUC_
  14.         pre;
  15.  
  16.     switch
  17.     (
  18.         test_type
  19.         (
  20.             e,
  21.             e_const | e_var | e_bool | e_reg  |
  22.                       e_pre_inc_dec | e_post_inc_dec
  23.         )
  24.     )
  25.     {
  26.         case e_const:
  27.             gencode(e,
  28.                        test_type(e, e_int) ?
  29.                            op_push_imm
  30.                         :
  31.                            op_push_strconst,
  32.                     e->evalue);
  33.         break;
  34.  
  35.         case e_var:
  36.             if (!e->codelen)
  37.                 gencode(e, op_push_var, e->evalue);
  38.         break;
  39.  
  40.         case e_bool:
  41.             patchup_true(e, 1);
  42.             gencode(e, op_push_1_jmp_end);
  43.             patchup_false(e, 1);
  44.             gencode(e, op_push_0);
  45.             set_type(e, e_int);
  46.         break;
  47.  
  48.         case e_reg:
  49.             gencode(e, op_push_reg);
  50.         break;
  51.  
  52.         case e_post_inc_dec:
  53.             pre = stackframe(0);
  54.             gencode(&pre, op_push_var, e->evalue);
  55.             *e = *catcode(&pre, e);         /* prefix push before var++, var-- */
  56.         break;
  57.  
  58.         case e_pre_inc_dec:                 /* append push after ++var, --var */
  59.             gencode(e, op_push_var, e->evalue);
  60.         break;
  61.     }
  62.     down_type(e, e_const | e_var | e_bool | e_reg |
  63.                  e_pre_inc_dec | e_post_inc_dec);
  64.     up_type(e, e_code);
  65. }
  66.